package com.torresquintero.oncologos.secretaria.controladores;

import com.torresquintero.oncologos.common.entityUtilities.PacienteUtilities;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;

import com.torresquintero.oncologos.common.factory.FactoryEntityManager;
import com.torresquintero.oncologos.entidades.Consulta;
import com.torresquintero.oncologos.entidades.Medico;
import com.torresquintero.oncologos.entidades.OrdenMedica;
import com.torresquintero.oncologos.entidades.Paciente;
import com.torresquintero.oncologos.enumeraciones.EstadoConsultaEnum;
import com.torresquintero.oncologos.enumeraciones.MotivoConsultaEnum;
import com.torresquintero.oncologos.enumeraciones.TipoDocumentoEnum;

/**
 * Controlador de la asignacion de Consultas.
 * 
 * @author Camilo Andres
 * 
 */
public class AsignarConsultasController {

	/**
	 * Variable statica para el partron Singleton
	 */
	private static AsignarConsultasController asignarControladorConsultas;
	/**
	 * Administrador de entidades.
	 */
	private EntityManager em;

	/**
	 * Orden medica de la Consulta.
	 */
	private OrdenMedica ordenMedicaConsulta;

	/**
	 * Consulta donde se agregara todo.
	 */
	private Consulta consulta;

	/**
	 * Paciente de la Consulta.
	 */
	private Paciente paciente;
        
        /**
         * Medico de la consulta.
         */
        private Medico medico;
        /**
         * Motivo de la consulta.
         */
        private MotivoConsultaEnum motivo;
   
        /**
         * Fecha en la cual se pidio la cita.
         */
        private Date fechaConsulta;

	/**
	 * Constructor
	 */
	private AsignarConsultasController() {

		em = FactoryEntityManager.getEm();
	}

	/**
	 * Metodo para obtener una instancia singleton de esta clase.
	 * 
	 * @return
	 */
	public static AsignarConsultasController getInstance() {

		if (asignarControladorConsultas == null) {
			asignarControladorConsultas = new AsignarConsultasController();
		}
		return asignarControladorConsultas;
	}

	/**
	 * Metodo para determinar las Consultas del medico entre dos fechas.
	 * 
	 * @param fecha1
	 *            fecha inicial.
	 * @param fecha2
	 *            fecha final
	 * @return lista de consultas
	 */
	public List<Consulta> buscarConsultasEntreFechasMedico(Date fecha1,
			Date fecha2, Medico medico) {
		 Date fechaMayor = null;
		 Date fechaMenor = null;
		
		 if (fecha1.compareTo(fecha2) > 0){
			    fechaMayor = fecha1;
			    fechaMenor = fecha2;
			   }else{
			    fechaMayor = fecha2;
			    fechaMenor = fecha1;
			   }
		return em.createNamedQuery(Consulta.FIND_CONSULTA_BY_MEDICO_AND_FECHAS)
				.setParameter(Consulta.PARAMETRO_REGISTRO_MEDICO, medico.getRegistroMedico())
				.setParameter(Consulta.PARAMETRO_MENOR_FECHA, fechaMenor)
				.setParameter(Consulta.PARAMETRO_MAYOR_FECHA, fechaMayor).getResultList();
	}
        
        /**
         * Metodo que almacena la cita.
         */
        public void asignarCita() throws Exception{
            
            //TODO: verificar disponibilidad.
            em.getTransaction().begin();
            Consulta consulta=new Consulta();
            consulta.setMedico(medico);
            consulta.setMotivo(motivo);
            consulta.setFechaHora(fechaConsulta);
            consulta.setPaciente(paciente);
            consulta.setEstado(EstadoConsultaEnum.EN_ESPERA);
            em.persist(consulta);
            
            em.getTransaction().commit();
            asignarControladorConsultas=new AsignarConsultasController();
        }

	/**
	 * Metodo para determinar las Consultas de un paciente entre dos fechas. si
	 * las fechas son null se debe retornar todas las Consultas del paciente.
	 * ssi la fecha final es null, entonces solo desde la fecha inicial
	 * 
	 * @param fecha1
	 *            fecha inicial
	 * @param fecha2
	 *            fecha final
	 * @param paciente
	 * @return
	 */
	public List<Consulta> buscarConsultasEntreFechasPaciente(Date fecha1,
			Date fecha2, Paciente paciente) {
		// TODO:
		return null;
	}

	/**
	 * Metodo para buscar el paciente de la Consulta.
	 * 
	 * @param cedula
	 *            del paciente
	 * @param tipoDoc
	 *            tipo de documento del paciente.
	 * @return el peciente o null si no esta.
	 */
	public Paciente buscarPaciente(String cedula, TipoDocumentoEnum tipoDoc) {
		paciente= PacienteUtilities.buscarPaciente(cedula, tipoDoc);
                return paciente;
	}

	/**
	 * Metodo para determinar si en una fecha y hora particular el Medico esta
	 * disponible.
	 * 
	 * @param fechaHora
	 *            fechaHora.
	 * @param medico
	 *            medico de la consulta.
	 * @return
	 */
	public boolean determinarConsultaDisponible(Date fechaHora, Medico medico) {
		// TODO:
		return true;
	}

    public Medico getMedico() {
        return medico;
    }

    public void setMedico(Medico medico) {
        this.medico = medico;
    }

    public void setFechaConsulta(Date fechaConsulta) {
        this.fechaConsulta = fechaConsulta;
    }

    public void setMotivo(MotivoConsultaEnum motivo) {
        this.motivo = motivo;
    }
        
        
       

}
